package main

import (
	"errors"
	"fmt"
	"io/fs"
	"os"
)

/*
error：正常的流程错误，需要处理，直接忽略也不影响程序运行
panic：很严重的问题，程序应该在处理完问题后理解退出
fatal：致命问题，程序应该立即退出
*/

// 大部分情况，为了更好的维护性，一般都不会临时创建 error，而是会将常用的 error 当作全局变量使用
var (
	ErrInvalid = fs.ErrInvalid // "invalid argument"

	ErrPermission = fs.ErrPermission // "permission denied"
	ErrExist      = fs.ErrExist      // "file already exists"
	ErrNotExist   = fs.ErrNotExist   // "file does not exist"
	ErrClosed     = fs.ErrClosed     // "file already closed"

	//ErrNoDeadline       = errNoDeadline()       // "file type does not support deadline"
	//ErrDeadlineExceeded = errDeadlineExceeded() // "i/o timeout"
)

func main() {
	// 打开一个文件
	file, err := os.Open("E:\\openAPP\\GoLand 2023.3.8\\GoDemo\\awesomeProject1\\basicDemo\\data\\t1.txt")
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(file)

	// 通过errors创建一个error
	err2 := errors.New("我是错误提示信息")
	fmt.Println(err2)
	// 通过fmt包下的Errorf函数
	err3 := fmt.Errorf("%d/0 失败，除数不能为0", 9)
	fmt.Println(err3)
}

// 自定义错误
func New(text string) error {
	return &errorString{text}
}

// errorString结构体
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}
